/**
 * 版权所有(C)，上海勾芒信息科技，2017，所有权利保留。
 * 
 * 项目名：	cards-web
 * 文件名：	WxComponentService.java
 * 模块说明：	
 * 修改历史：
 * 2017年4月21日 - Debenson - 创建。
 */
package me.chanjar.weixin.component.api;

import java.util.Map;

import com.gomore.jeecg.common.Assert;
import com.google.common.base.Joiner;
import com.google.common.collect.Maps;

import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import me.chanjar.weixin.common.WxNetworking;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.component.api.app.WxCompMaServiceDelegate;

/**
 * 微信开放平台API的Service
 * 
 * @author Debenson
 * @since 0.1
 */
public interface WxCompService extends WxNetworking {

  /**
   * 获取access_token, 不强制刷新access_token
   *
   * @see #getAccessToken(boolean)
   */
  String getAccessToken() throws WxErrorException;

  /**
   * <pre>
   * 获取access_token，本方法线程安全
   * 且在多线程同时刷新时只刷新一次，避免超出2000次/日的调用次数上限
   *
   * 另：本service的所有方法都会在access_token过期是调用此方法
   *
   * 程序员在非必要情况下尽量不要主动调用此方法
   *
   * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN
   * </pre>
   *
   * @param forceRefresh
   *          强制刷新
   */
  String getAccessToken(boolean forceRefresh) throws WxErrorException;

  /**
   * 获取authorizer_access_token, 不强制刷新authorizer_access_token
   * 
   * @param appId
   *          小程序或公众号的appId
   * @return
   * @throws WxErrorException
   * @see {@link #getAuthorizerAccessToken(String, boolean)}
   */
  String getAuthorizerAccessToken(String appId) throws WxErrorException;

  /**
   * <pre>
   * 获取authorizer_access_token，本方法线程安全
   * 且在多线程同时刷新时只刷新一次，避免超出2000次/日的调用次数上限
   *
   * 另：本service的所有方法都会在authorizer_access_token过期是调用此方法
   *
   * 程序员在非必要情况下尽量不要主动调用此方法
   *
   * 详情请见: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=3910cb31f95bc5d7152b89d4607e63f721069bec&lang=zh_CN
   * </pre>
   *
   * @param appId
   *          小程序或公众号的appId
   * @param forceRefresh
   *          强制刷新
   */
  String getAuthorizerAccessToken(String appId, boolean forceRefresh) throws WxErrorException;

  /**
   * 获取WxComponentConfigStorage 对象
   *
   * @return WxComponentConfigStorage
   */
  WxCompConfigStorage getConfigStorage();

  /**
   * 注入 {@link WxCompConfigStorage} 的实现
   */
  void setConfigStorage(WxCompConfigStorage wxComponentConfigProvider);

  /**
   * 取得开放平台的授权服务。
   *
   * @return
   */
  WxCompAuthorService getAuthorService();

  /**
   * 取得小程序的代理服务。
   * 
   * @return
   */
  WxCompMaServiceDelegate getMaServiceDelegate();

  /**
   * 托管小程序登录
   * 
   * @param code
   * @param appId
   *          小程序appId
   * @return
   */
  WxMaJscode2SessionResult getSessionInfo(String code, String appId) throws WxErrorException;

}
